#include "file.h"
//#include "sys/io.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <QIODevice>
#include <QFileInfo>
#include <QTextStream>
#include <QStringList>
#include<qdebug.h>
#include<qtextcodec.h>

#define MAX_SIZE 1024

File::File()
{

}

File::~File()
{

}

//desktop菜单启动器 读取数据
QString File::conf_get_uri(const char *config_file,const char *key)
{
    FILE* fp;
    int i, len;
    char buf[512], source_uri[128];
    char *cpklog, *saveptr, *tmp;
    if ((fp = fopen(config_file, "r")) == NULL)
    {
        fprintf(stderr, "Failed open %s\n", config_file);
        return "";
    }
    while (fgets(buf, 512, fp) != NULL)
    {
        /* 去除字符串尾的换行符 */
        i = strlen(buf) - 1;
        while (buf[i] == '\n')
        {
            buf[i] = '\0';
            i--;
        }
        util_rm_htblank(buf);  // 去除首尾的空格
        if (buf[0] == '[')  // 跳过注释
            continue;
        cpklog = strtok_r(buf, "=", &saveptr);
        // g_critical("==============cpklog:%s", cpklog);
        if (!cpklog)
            continue;  // 跳过不符合规则的行
        tmp = NULL;
        tmp = strtok_r(NULL, "=", &saveptr);
        if(!strcmp(cpklog, key))
        {
            if (tmp)
            {
                //g_critical("===========tmp:%s",tmp);
                strcpy(source_uri, tmp);
                len = strlen(source_uri);
                if (source_uri[len - 1] != '\0')
                {
                    source_uri[len] = '\0';
                }
                if(fp)
                    fclose(fp);
                return  QString::fromStdString(strdup(source_uri));
            }
            else
                continue;
        }
        else
            continue;
    }
    if(fp)
        fclose(fp);
    return "";
}

//基本信息 读取数据，从临时文件中，根据名称取值（重新写的方法，代替了原版的conf_get_uri2()）
QString File::value_of_the_key(const char *con_file, const char *key)
{
    FILE* fp;
    char buf[200] = "";
    //C方式打开文件
    if( (fp = fopen(con_file,"r")) == NULL )
    {
        fprintf(stderr, "Failed open %s\n", con_file);
        return "";
    }

    char item_key[20] = "";
    char search_key[20] ;
    strcpy(search_key,key);
    QString QSTemp = "";

    while(fgets( buf, 200, fp) != NULL)
    {
        //判断该行长度
        if(strlen(buf) > strlen(search_key))
        {
            //         取一行等长字符串
            for(int i = 0; i < (int)strlen(search_key); i++)
            {
                item_key[i] = buf[i];
            }

            //          判断是否相同
            if(strcmp(item_key,search_key) == 0)
            {
                //第一个：后的值为value
                char* value =  strstr(buf,":");

                //去除可能存在的第一个空格,\n,第一个：
                while( value[0] == ' ' || value[0] == '\n' || value[0] == ':')
                {
                    for( int i = 0; i+1 <= (int)strlen(value); i++ )
                    {
                        value[i] = value[i+1];
                    }
                }
                //去除最后可能存在的空格,\n
                while( value[(int)strlen(value) - 1] == ' ' || value[(int)strlen(value) - 1] == '\n' )
                {
                    value[strlen(value) -1] = '\0';
                }
                QSTemp.append(value);

                //是Description则将之后的文本全部追加
                if(!strcmp(key,"Description"))
                {
                    while (fgets( buf, 200, fp) != NULL) {
                        QSTemp.append(buf);
                    }
                }
                break;
            }
        }
    }
    //    qDebug() << "---------------------------------" << "\n<key>\n"<<key << "\n<value>\n" << QSTemp << "------------------------------";

    return QSTemp;

}

//已由value_of_the_key（）替代
//QString File::conf_get_uri2(const char *config_file,const char *key)
//{
//       FILE* fp;
//        int i, len;
//        char buf[200], source_uri[128];
//        char *cpklog, *saveptr, *tmp;
//        if ((fp = fopen(config_file, "r")) == NULL)
//        {
//            fprintf(stderr, "Failed open %s\n", config_file);
//            return "";
//        }


//        if(!strcmp(key,"Description"))
//        {
////            qDebug() << "Description----------------------------------------------------" ;

//            char item_key[20] = "";
//            char search_key[20] ;
//            strcpy(search_key,key);
//            QString QSTemp = "";
//            while(fgets( buf, 200, fp) != NULL)
//            {
//                if(strlen(buf) > strlen(search_key))
//                {
////                    search = buf;
//                    for(int i = 0; i < (int)strlen(search_key); i++)
//                    {
//                        item_key[i] = buf[i];
//                    }
////                    qDebug() << "item_key:  " << item_key;

//                    if(strcmp(item_key,search_key) == 0)
//                    {
////                        qDebug() << "success key: " << search_key;
//                        while (fgets( buf, 200, fp) != NULL) {
//                           QSTemp.append(buf);
//                        }
//                    }
//                }
//            }
////            qDebug() << "Description----------------------------------------------------" ;
//            return QSTemp;
//        }

//        while (fgets(buf, 200, fp) != NULL)
//        {
//            /* 去除字符串尾的换行符 */
//            i = strlen(buf) - 1;
//            while (buf[i] == '\n')
//            {
//                buf[i] = '\0';
////                buf[i] = ' ';
//                i--;
//            }
//            util_rm_htblank(buf);  // 去除首尾的空格
//            if (buf[0] == '[')  // 跳过注释
//                continue;

//            QStringList strList = QString::fromLocal8Bit(buf).split(":");
//             int nCount = strList.size();
//             if(nCount <= 2)
//             {
//                 cpklog = strtok_r(buf, ":", &saveptr);
//                // g_critical("==============cpklog:%s", cpklog);
//                 if (!cpklog)
//                     continue;  // 跳过不符合规则的行
//                 tmp = NULL;
//                 tmp = strtok_r(NULL, ":", &saveptr);
//             }
//            else
//             {
//                 cpklog = strtok_r(buf, ":", &saveptr);
//                 if (!cpklog)
//                     continue;  // 跳过不符合规则的行
//                 char* s_tmp[nCount];
//                 for(int i = 0; i < nCount; ++i)
//                 {
//                     tmp = NULL;
//                     tmp = strtok_r(NULL, ":", &saveptr);
//                     s_tmp[i] = tmp;
//                 }
//                 tmp = "";
//                for(int j = 0; j < nCount; ++j)
//                {
//                    char* a = s_tmp[j];
//                    tmp = QString(QString::fromLocal8Bit(tmp)  + QString::fromLocal8Bit(a)).toLocal8Bit().data();
//                }
//             }

//             util_rm_htblank(cpklog);  // 去除首尾的空格
//             util_rm_htblank(tmp);  // 去除首尾的空格
//             char*  char_tmp[15];
//             memset(char_tmp, 0, sizeof(char)*15);
//             int rows = 0;
//             if(!strcmp(cpklog, key))
//             {
////                if(!strcmp(key,"Description"))
////                {
//////                    static int num = 0;

////                    //读取数据至文件结尾
////                   while (fgets(buf, 200, fp) != NULL)
////                   {
//////                        qDebug()<< "buff "<< num++ << "------" << buf;
////                       /*去除字符串尾的换行符 */
////                     int   i = strlen(buf) - 1;
////                     while (buf[i] == '\n')
////                     {
////                        buf[i] = '\0';
//////                        buf[i] = ' ';
////                        i--;
////                     }
////                      util_rm_htblank(buf);  //去除首尾的空格
////                      char_tmp[rows] = buf;
////                      rows++;
////                      if(fgetc(fp)==EOF)break;
////                    }
////                    for(int k = 0; k < rows; ++k)
////                    {
////                        tmp = QString(QString::fromLocal8Bit(tmp)  + QString::fromLocal8Bit(char_tmp[k])).toLocal8Bit().data();
////                    }
////                }
//                if (tmp)
//                {
//                    //g_critical("===========tmp:%s",tmp);
//                    strcpy(source_uri, tmp);
//                    len = strlen(source_uri);
//                    if (source_uri[len - 1] != '\0')
//                     {
//                        source_uri[len] = '\0';
//                    }
//                     if(fp)
//                        fclose(fp);
//                    return  QString::fromStdString(strdup(source_uri));
//                }
//                else
//                    continue;
//            }
//            else
//                continue;
//        }
//        if(fp)
//            fclose(fp);
//        return "";
//}

/**
 * @brief : 去除字符串首尾的空白符 head and tail
 * @param : str -- 字符串
 * @return : 返回 str
 */
char *File::util_rm_htblank(char *str)
{
    int i;
    char* tmp, *st;

    if (str == NULL)
        return NULL;
    /* st 用于保存申请空间的首地址，用于free释放
     * tmp 对 str 做一个备份
     */
    st = tmp = strdup(str);
    /* 去除字符串首部的空白符 */
    i = 0;
    while (tmp[i] == '\t' || tmp[i] == ' ')
    {
        tmp++;
    }
    /* 去除字符串尾部的空白符 */
    i = strlen(tmp) - 1;
    while (*(tmp + i) == '\t' || *(tmp + i) == ' ')
    {
        *(tmp + i) = '\0';
        i--;
    }
    strcpy(str, tmp);
    free(st);
    //puts(str);
    return str;
}

//QString File::readConf(QString conf_file)
//{
//    QString preinst_file =conf_file.append("\preinst");
//    QString postinst_file = conf_file.append("\postinst");
//    QString prerm_file = conf_file.append("\prerm");
//    QString postrm_file = conf_file.append("\postrm");
//#if 0
//    QFileInfo f(conf_file.toLocal8Bit().data());
//    if(f.exists())
//    {
//        //如果文件存在，则读取文件
//        QFile file(conf_file);
//        if(!file.open(QFile::WriteOnly|QFile::Text))
//        {
//            return false;
//        }
//        QStringList lines;
//        QTextStream stream(&file);
//        QString line;
//        int n = 1;
////        while(!stream.eof())
////        {
////            line  = stream.readLine();  //不包括“/n”的一行文本
////            printf("%3d:%s/n",n++,line.toLatin1());
////            lines += line;
////        }
//        file.close();
//    }
//#else
////    File* pFile;
////    char mystring[1000];
////    pFile = fopen(conf_file.toLocal8Bit().data(), r);
////    if(pFile == NULL)

//#endif
//}


//void File::readDes(const char* config_file)
//{
//    FILE *fd;
//       char line[1024];
//       fd=fopen(config_file,"r");
//       char *p;
//       char str[]="Description:";

//       while(fgets(line,1024,fd))
//       {
//           if(p=strstr(line,str))
//           {
//               printf("%s",p+strlen(str));
//               break;
//           }
//       }
//       fclose(fd);
//}

void File::inputShell(char * shell)
{
    FILE *read_fp = NULL;
    char buffer[MAX_SIZE];
    int chars_read = 0;

    memset(buffer, 0, sizeof(buffer));
    read_fp = popen(shell, "r");
    if (read_fp == NULL)
    {
        sprintf(buffer,"error:%s\n",strerror(errno));
        //异常处理
        qDebug() << "popen error : " << buffer;
    }
    else
    {
        chars_read = fread(buffer, sizeof(char), MAX_SIZE, read_fp);
        qDebug("Reading:\n%s\n", buffer);
        while (chars_read > 0)//读取多数shell命令，shell命令比较长。
        {
            buffer[chars_read - 1] = 0;
            qDebug("Reading:\n%s\n", buffer);
            chars_read = fread(buffer, sizeof(char), MAX_SIZE, read_fp);
        }
        pclose(read_fp);
        //return EXIT_SUCCESS;
    }
}

// 描述:execmd函数执行命令，并将结果存储到result字符串数组中
// 参数:cmd表示要执行的命令
// result是执行的结果存储的字符串数组
// 函数执行成功返回1，失败返回0
int File::execmd(char* cmd,char* result) {
    char buffer[128];                         //定义缓冲区
    FILE* pipe = popen(cmd, "r");            //打开管道，并执行命令
    if (!pipe) return 0;                      //返回0表示运行失败

    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe)){             //将管道输出到result中
            strcat(result,buffer);
        }
    }
    pclose(pipe);                            //关闭管道
    return 1;                                 //返回1表示运行成功
}

